#pragma once
#include "events.h"

#pragma once
#include <stdio.h>
#include "events.h"
#include "nature.h"

class Nature;
extern Nature nature;
/*生物类，作为狼、羊、草三种生物的基类
* 内含生物的基本信息和行为函数，如姓名（编号）、年龄、性别、生命值、饥饿值、位置信息、生存状态
* 生物对象的生命周期为：被new生成，通过构造函数Creature()随机设定基本数值，然后随回合执行动作action()，最后死亡，死亡后被析构
* 生物在每回合的行为模式是：首先计算身体状况situation()，根据身体状况确定行为模式（m_flag.mode）是觅食（1）还是求偶（2）
然后根据这点搜索search()不同种类生物，如果有则以该生物为对象做出动作（移动过去或移动远离），如果没有则随机移动
*/

enum CreatureType
{
	CT_NONE,
	CT_WOLF,
	CT_SHEEP,
	CT_GRASS
};

struct Position;

class Creature
{
public:
	int m_name = 0;
	int m_id = 0;
	/*名字针对本类，id针对整个生物数组*/
	CreatureType m_race = CT_NONE;

	int m_live = 0; /*活还是死*/
	int m_dead = 0; /*死因*/

	int m_mode = 0; /*行动模式，1觅食2繁衍3闲逛*/

	int m_age = 0;
	int m_hp = 0;
	int m_hunger = 0;
	int age_up = 20;
	int hp_up = 100;
	int hunger_full = 100;

	Position m_position;
	Position m_direction; /*向哪里移动，直接存储x和y方向的位移量*/

	int m_sight = 20;	   /*视野范围*/
	int m_step = 10;	   /*最大移动距离*/
	int m_distance = 9999; /*最短距离*/

	Creature *m_target = nullptr;

	Creature();
	Creature(int name);
	Creature(int name, int x, int y, Flag flag);
	virtual ~Creature();

	virtual void action();
	virtual int situation();		/*状况结算,返回m_mode*/
	void search(int mode);			/*搜索*/
	void get_distance(Creature &c); /*计算两者的距离*/
	void move(Creature &c, int mode);

	void move_to(Creature &c);	/*向某个对象移动*/
	void move_out(Creature &c); /*远离某个对象*/
	void move_to();				/*随机移动*/

	virtual void eat(Creature &c); /*捕食*/
	virtual void breed();		   /*繁衍*/

	/*记录事件有多种格式，即可按照输入格式不同生成不同预设的事件
	 * 记录一定会需要的：时间地点、人物（name和物种flag）、事件（通过flag.mode）、事件对象（target）、造成的影响（暂时没有，后补）
	 * 现在是事件有三类，即捕食、繁衍和死亡，前两类传递flag.mode，死亡传递flag.live
	 */
	void record(); /*记录事件，生成一个对象并填入相关变量，可以通过填入的变量数量不同进行多态，需要明确依赖关系*/
	virtual void record(Creature &c);
	void record(Creature &c, int name);
};
